﻿create or replace package PKG_KSZYY_JIANHAN_GUAHAOYYJK is

  -- Author  : ZGYING
  -- Created : 2011-5-4 9:53:14
  -- Purpose : 昆山中医院 建行 挂号预约接口
  
  /*
  字符串拼装方式：交易编号$$发送时间|消息ID|交易信息A|交易信息B|交易信息C$$，其中“$$“为段分隔符，交易信息采用 “|“ 进行分隔。
  发送时间格式：YYYYMMDDHHMMSS
  消息ID约定：
  建行发送的消息编号：CCB+10位序列号，如：CCB0000000001
  HIS发送的消息编号：HIS+10位序列号，如：HIS0000000001
  示例：
  1000$$20110411233444| CCB0000000001|||||||$$
    应答消息
  应答交易统一采用“ACK交易编号$$应答时间|原消息ID|交易结果$$ ”的形式来处理。
  示例：
  原 消 息： 1000$$20110411233444| CCB0000000001|||||||$$
  应答交易：ACK1000$$ 2011041123344| CCB0000000001 |||$$

  */
  
  SUCCEED        CONSTANT NUMBER(1) := 1;
  ERROR          CONSTANT NUMBER(1) := -1; 
  
  PROCEDURE PRC_PROCESSRECVMSG( PRM_MSG IN VARCHAR2, PRM_RESULT OUT VARCHAR2 );

  
  --预约挂号 交易号 1000
  PROCEDURE PRC_YUYUEGH( PRM_MSG IN VARCHAR2 , PRM_APPCODE OUT NUMBER , PRM_OUTBUFFER OUT VARCHAR2  );
 
  --取消预约 交易号 1002
  PROCEDURE PRC_QUXIAOYY( PRM_MSG IN VARCHAR2 , PRM_APPCODE OUT NUMBER , PRM_OUTBUFFER OUT VARCHAR2  );
   
  --排班变更 交易号 2000
  PROCEDURE PRC_PAIBANBG( PRM_MSG IN VARCHAR2 );

  --取号确认 交易号 2001
  PROCEDURE PRC_QUHAOQR( PRM_MSG IN VARCHAR2 ) ;

end PKG_KSZYY_JIANHAN_GUAHAOYYJK;
/
create or replace package body PKG_KSZYY_JIANHAN_GUAHAOYYJK is

  
  /* 处理接收到的消息
     YingZhongGuang
  */  
  PROCEDURE PRC_PROCESSRECVMSG( PRM_MSG IN VARCHAR2, PRM_RESULT OUT VARCHAR2 ) IS
   S_JIAOYIBH  VARCHAR2(10);
   S_XIAOXIID  VARCHAR2(10);
   S_XIAOXIRQ  VARCHAR2(10);
   S_MSG       VARCHAR2(2000);
   
   S_OUTBUFFER VARCHAR2(2000);
   N_APPCODE   NUMBER;
  BEGIN
    
   S_MSG := PRM_MSG;  
   S_JIAOYIBH := FUN_GY_GETTOKEN( S_MSG , '$$');     --交易编号
   
   S_MSG :=  FUN_GY_GETTOKEN( S_MSG , '$$');       --消息内容
   S_XIAOXIRQ := FUN_GY_GETTOKEN( S_MSG , '|' );   --消息日期
   S_XIAOXIID := FUN_GY_GETTOKEN( S_MSG , '|' );   --消息ID
   
   IF S_JIAOYIBH = '0001' THEN
      PRC_YUYUEGH( S_MSG , N_APPCODE, S_OUTBUFFER);    
   ELSIF S_JIAOYIBH = '0002' THEN      
      PRC_YUYUEGH( S_MSG , N_APPCODE, S_OUTBUFFER);
   END IF;
      
   PRM_RESULT := 'ACK' || TO_CHAR( SYSDATE , 'YYYYMMDDHHMISS' )  ||'|' || S_XIAOXIID || '|' || S_OUTBUFFER ||  '$$';
   RETURN;      
      
  END;
  
--预约挂号 交易号 1000
  PROCEDURE PRC_YUYUEGH( PRM_MSG IN VARCHAR2 , PRM_APPCODE OUT NUMBER , PRM_OUTBUFFER OUT VARCHAR2 ) IS
    S_MSG                     VARCHAR2(4000);  
    
    S_YUYUEHAO                VARCHAR2(10);  --由建行提供，用户凭此号到医院取号。必须以”6”开头
    S_WAIBUYHID               VARCHAR2(10);  --为外部系统所对应患者的唯一编号
    S_YUYUELSH                VARCHAR2(10);  --为外部系统预约时所产生的流水号，不可重复
    S_XINGMING                VARCHAR2(50);  --姓名
    S_ZHENJIANLX              VARCHAR2(2);   --1:身份证;2:驾驶证;3:护照;4:户口簿;5:军官证;6:士兵证;7:回乡证;8:通行证;9:临时身份证;10:外国人居留证;11:警官证;12:其他证件
    S_ZHENJIANHM              VARCHAR2(18);  --证件号码
    S_JIATINGDZ               VARCHAR2(100); --家庭地址   
    S_LIANXIDH                VARCHAR2(20);  --联系电话
    S_PAIBANID                VARCHAR2(10);  --排班ID  
    S_YUYUERQ                 VARCHAR2(8);   --预约日期 
    S_YUYUESD                 VARCHAR2(1);   --预约时段
        
    S_PARM                    VARCHAR2(4000);             
                     
  BEGIN
    Prm_AppCode := SUCCEED;
    prm_OutBuffer := '';
      
    --收到预约建行提供的预约挂号信息,由MessageBroker收到消息时调用的PushMsg触发
    S_MSG := PRM_MSG;     
    --原 消 息： 1000$$20110411233444| CCB0000000001|||||||$$
    --应答交易：ACK1000$$ 2011041123344| CCB0000000001 |||$$

    S_YUYUEHAO := FUN_GY_GETTOKEN( S_MSG , '|' );
    
    IF SUBSTR( S_YUYUEHAO , 1 , 1 ) <> '6' THEN
       PRM_APPCODE := ERROR;
       PRM_OUTBUFFER := '预约号必须以6开头。';
       RETURN;
    END IF;
    
    S_WAIBUYHID := FUN_GY_GETTOKEN( S_MSG , '|' );
    S_YUYUELSH := FUN_GY_GETTOKEN( S_MSG , '|' );
    S_XINGMING := FUN_GY_GETTOKEN( S_MSG , '|' );
    S_ZHENJIANLX := FUN_GY_GETTOKEN( S_MSG , '|' );
    S_ZHENJIANHM := FUN_GY_GETTOKEN( S_MSG , '|' );
    S_JIATINGDZ := FUN_GY_GETTOKEN( S_MSG , '|' );
    S_LIANXIDH := FUN_GY_GETTOKEN( S_MSG , '|' );
    S_PAIBANID := FUN_GY_GETTOKEN( S_MSG , '|' );
    S_YUYUERQ := FUN_GY_GETTOKEN( S_MSG , '|' );
    S_YUYUESD := FUN_GY_GETTOKEN( S_MSG , '|' );
              
    --构造登记字符串    
    S_PARM := S_WAIBUYHID || '|' ;              --外部用户ID 对应HIS的UserID
    S_PARM := S_PARM || ''  || '|' ;    --就诊卡号
    S_PARM := S_PARM || '' || '|' ;    --医保卡号
    S_PARM := S_PARM || S_XINGMING || '|' ;    --姓名
    S_PARM := S_PARM || '' || '|' ;    --医保卡号
    S_PARM := S_PARM || '' || '|' ;    --性别
    S_PARM := S_PARM || S_ZHENJIANHM || '|' ;    --身份证号
    S_PARM := S_PARM || '' || '|' ;    --出生日期 ？
    S_PARM := S_PARM || '' || '|' ;    --血型
    S_PARM := S_PARM || '' || '|' ;    --婚姻
    S_PARM := S_PARM || '' || '|' ;    --职业               
    S_PARM := S_PARM || '' || '|' ;    --国籍
    S_PARM := S_PARM || '' || '|' ;    --民族
    S_PARM := S_PARM || '' || '|' ;    --既往史
    S_PARM := S_PARM || '' || '|' ;    --过敏史        
    S_PARM := S_PARM || S_JIATINGDZ || '|' ;    --家庭地址
    S_PARM := S_PARM || S_LIANXIDH || '|' ;    --联系电话
    S_PARM := S_PARM || '' || '|' ;    --联系人
    S_PARM := S_PARM || '' || '|' ;    --手机
    
    IF S_YUYUESD = '0' THEN      --上午
      S_PARM := S_PARM || 'S' || S_PAIBANID || '|' ;    --排班ID
    ELSIF S_YUYUESD = '1' THEN      --下午
      S_PARM := S_PARM || 'X' || S_PAIBANID || '|' ;    --排班ID
    ELSE
      S_PARM := S_PARM || 'W' || S_PAIBANID || '|' ;    --排班ID
    END IF;                                        --晚上 ?
    
    S_PARM := S_PARM || '2' || '|' ;    --排班模式           普通排班 1 周排班 2 特殊排班
    S_PARM := S_PARM || SUBSTR( S_YUYUERQ , 1 , 4 ) || '-' || SUBSTR( S_YUYUERQ , 5 , 2 ) || '-' || SUBSTR( S_YUYUERQ , 7 , 2 ) || '|' ;    --预约日期
    S_PARM := S_PARM || '' || '|' ;    --预约类型
    S_PARM := S_PARM || '' || '|' ;    --记录来源
    S_PARM := S_PARM || '' || '|' ;    --申请人
    S_PARM := S_PARM || '' || '|' ;    --申请人姓名
    S_PARM := S_PARM || '' || '|' ;    --操作员
    S_PARM := S_PARM || S_YUYUEHAO || '|' ;    --预约号
    S_PARM := S_PARM || '' || '|' ;    --家庭电话
    S_PARM := S_PARM || '' || '|' ;    --单位电话
    S_PARM := S_PARM || '' || '|' ;    --审核信息 

    --调用PKG_MZ_YuYue.PRC_GY_TIJIAOYUYUEXX
    HIS3.PKG_MZ_YuYue.PRC_GY_TIJIAOYUYUEXX( S_PARM , Prm_AppCode , prm_OutBuffer );
    
    --返回正确错误常量与HIS3不同??,做转换
    IF PRM_APPCODE <> 1 THEN
       PRM_APPCODE := ERROR;    
    END IF;    
    --返回调用结果,由MessageBroker直接返回给Socket返回
  END;
 
  /*
   取消预约 交易号 1002
   预约号|取消结果|返回字符
  */
  PROCEDURE PRC_QUXIAOYY( PRM_MSG IN VARCHAR2 , PRM_APPCODE OUT NUMBER , PRM_OUTBUFFER OUT VARCHAR2 ) IS
    S_YUYUEHAO    VARCHAR2(20);            
  BEGIN   
    PRM_APPCODE := SUCCEED;
    PRM_APPCODE := '';
    
    S_YUYUEHAO := PRM_MSG;

    HIS3.PKG_MZ_YuYue.PRC_GY_QUXIAOYY( S_YUYUEHAO , Prm_AppCode , prm_OutBuffer );
    IF PRM_APPCODE <> 1 THEN
       PRM_APPCODE := ERROR;
    END IF;
    RETURN;       
  END;
    
   
  --排班变更 交易号 2000
  --job触发？
  --触发器触发?A
  PROCEDURE PRC_PAIBANBG( PRM_MSG IN VARCHAR2  ) IS
     S_MSG VARCHAR2(2000);
     S_MSGID VARCHAR2(20);
  BEGIN
     --将消息打包
     SELECT 'HIS' || TRIM( TO_CHAR( SEQ_MB_FASONGXXDL.NEXTVAL , '0000000000' ))
     INTO S_MSGID
     FROM DUAL;
          
     S_MSG := '2000$$' || TO_CHAR( SYSDATE , 'YYYYMMDDHHMISS' ) || '|' || S_MSGID || '|' || PRM_MSG || '$$';
     PKG_MB_FASONGXX.PUSHMSG( S_MSG );
  END;

  --取号确认 交易号 2001
  PROCEDURE PRC_QUHAOQR( PRM_MSG IN VARCHAR2 ) IS 
     S_MSG VARCHAR2(2000);
     S_MSGID VARCHAR2(20);
  BEGIN
     --将消息头
     SELECT 'HIS' || TRIM( TO_CHAR( SEQ_MB_FASONGXXDL.NEXTVAL , '0000000000' ))
     INTO S_MSGID
     FROM DUAL;
          
     S_MSG := '2001$$' || TO_CHAR( SYSDATE , 'YYYYMMDDHHMISS' ) || '|' || S_MSGID || '|' || PRM_MSG || '$$';
     PKG_MB_FASONGXX.PUSHMSG( S_MSG );
  END;
*/  
end PKG_KSZYY_JIANHAN_GUAHAOYYJK;
/
